struct ListNode {
    int val;
    ListNode* next;
    ListNode() : val(0), next(nullptr) {}
    ListNode(int x) : val(x), next(nullptr) {}
    ListNode(int x, ListNode* next) : val(x), next(next) {}
};

class Solution {
public:
    ListNode* detectCycle(ListNode* head) {
        if (head == nullptr) return head;
        ListNode* slow = head;
        ListNode* fast = head;
        do {
            if ( fast == nullptr|| fast->next == nullptr) return nullptr;
            slow = slow->next;
            fast = fast->next->next;
        } while (slow != fast);
        fast = head;

           
            while (slow != fast) {
                slow = slow->next;
                fast = fast->next;
         }
        return slow;
    }
};